const express = require("express");
const { createServer } = require("http");
const { Server } = require("socket.io");

// 创建 express 实例
const app = express();
const httpServer = createServer(app);
// 创建 socketIo 实例
const io = new Server(httpServer, {
  cors: {
    origin: "*",
  },
});

// 客户端链接的事件
io.on("connection", (socket) => {
  // socket 客户端实例
  console.log("链接进来了", socket);

  /**
   * 广播
   * @param {*} eventName 事件名称
   * @param {*} payload 事件参数
   * @param {*} skip 是否要跳过自己
   */
  function broadcast(eventName, payload, skip = false) {
    if (!skip) {
      socket.emit(eventName, payload);
    }

    socket.broadcast.emit(eventName, payload);
  }

  /**
   * 初始化事件
   *    触发时机，当用户建立链接之后，需要立刻触发该 init 事件
   *    name - 用户名
   */
  socket.on("init", (name) => {
    // 将名字写入到当前的 socket 实例上
    socket.nickName = name;

    // 给所有客户端广播一段消息
    broadcast("message", {
      nickName: "系统消息",
      text: `欢迎${name}进入聊天室`,
    });
  });

  /**
   * 客户端发来的消息
   *    text - 文本内容
   */
  socket.on("message", (text) => {
    // 给所有客户端广播一段消息
    broadcast(
      "message",
      {
        nickName: socket.nickName,
        text,
      },
      true
    );
  });
});

// 启动服务
httpServer.listen(3000, () => {
  console.log("服务启动成功");
});
